<?php
/**
 * Created by PhpStorm .
 * User: {Administrator}
 * Date: {2022/7/26 14:49}
 * Author: '树叶'
 * Email: 'ayunu@qq.com'
 * Motto Info: '理想如果不向现实做一点点屈服，那么理想也将归于尘土。'
 */

namespace wxpay;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;

class Wechat
{
    protected $config = [
        'app_id' => 'wx2a66cde38cb7ab28', // 公众号 APPID
        'miniapp_id' => 'wx2a66cde38cb7ab28', // 小程序 APPID
        'mch_id' => '1631499932', // 商户号
        'key' => 'beijingaichetianwangkejiyouxiang', // 主商户 key
        'notify_url'  => 'http://car.aichetuan.com/Api.php/Notify/order_wx_notify_url',
        'cert_client' => './cert/apiclient_cert.pem', // optional，退款等情况时用到
        'cert_key' => './cert/apiclient_key.pem',// optional，退款等情况时用到
        'optional' => [ // optional
            'file' => './logs/wechat.log',
            'level' => 'debug', // 建议生产环境等级调整为 info，开发环境为 debug
            'type' => 'daily', // optional, 可选 daily.
            'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
        ],
        'http' => [
            // optional
            'timeout' => 5.0,
            'connect_timeout' => 5.0,
            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
        ],
        'mode' => 'hk', // optional, dev/hk;当为 `hk` 时，为香港 gateway。
    ];

    /**
     * @param $order_no 订单号
     * @param $money 支付金额
     * @param $content 备注
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function index($order_no, $money, $content, $openid, $wx_notify_url = '')
    {

        $order = [
            'out_trade_no' => $order_no, // 支付单号 //商户订单号
            'total_fee'    => $money*100, // **单位：分**
            'body'   => $content, //备注
            'openid' => $openid, //$openid
        ];

        if ($wx_notify_url == 'gold_wx_notify_url')
        {
            $this->config['notify_url'] = 'http://car.aichetuan.com/Api.php/Notify/gold_wx_notify_url';
        }


        $wechat = Pay::wechat($this->config);
        $send = $wechat->miniapp($order);

        return $send;// laravel 框架中请直接 `return $alipay`
    }


    public function notify()
    {
        $wechat = Pay::wechat($this->config);

        try{
            $data = $wechat->verify(); // 是的，验签就这么简单！

            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况

            Log::debug('Wechat  notify', $data->all());
        } catch (\Exception $e) {
            // $e->getMessage();
            dump($e->getMessage());
        }


        return $wechat->success()->send();// laravel 框架中请直接 `return $alipay->success()`
    }

    /**
     * @param $out_trade_no 支付单号
     * @param $out_refund_no 微信退款单号
     * @param $total_fee 总金额
     * @param $refund_fee 退款金额
     * @param $title 退款备注Hu
     * @return \Yansongda\Supports\Collection
     * @throws \Yansongda\Pay\Exceptions\GatewayException
     * @throws \Yansongda\Pay\Exceptions\InvalidArgumentException
     * @throws \Yansongda\Pay\Exceptions\InvalidSignException
     */
    public function refunde($out_trade_no, $out_refund_no, $total_fee, $refund_fee, $title)
    {
        $order = [
            'out_trade_no'  => $out_trade_no,
            'out_refund_no' => $out_refund_no,
            'total_fee'     => $total_fee*100,
            'refund_fee'    => $refund_fee*100,
            'refund_desc'   => $title,
        ];

        $wechat = Pay::wechat($this->config);
        $send = $wechat->refund($order);

        return $send;
    }

    /**
     * @param $out_refund_no
     *
     * 查询订单信息
     */
    public function orderFind($out_refund_no)
    {
        $order = [
            'out_trade_no' => $out_refund_no
        ];
        $wechat = Pay::wechat($this->config);
        $result = $wechat->find($order);
        return $result;

    }
}